<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script src="./src/vue.js"></script>
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      .item {
        height: 130px;
        text-align: center;
        line-height: 130px;
        font-size: 18px;
        border-bottom: 1px solid blue;
      }
      .item:last-child {
        border-bottom: none;
      }
      #app {
        height: 100vh;
        overflow: hidden;
      }
      .goods {
        height: 100vh;
        overflow-y: scroll;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <goods></goods>
    </div>
    <template id="goods">
      <!-- 注意：只需要让当前绑定了 @scroll="loadMore" 的这个元素高度超出屏幕/组件的高度，它的父级元素高度和屏幕/组件的高度保持一致。 -->
      <div class="goods" @scroll="loadMore">
        <div class="item" v-for="(user,i) in users" :key="i">
          {{i}} = {{user.id}}
        </div>
      </div>
    </template>
    <script>
      const goods = {
        template: "#goods",
        data() {
          return {
            users: [
              { id: Math.random() * 100 + 100 },
              { id: Math.random() * 100 + 100 },
              { id: Math.random() * 100 + 100 },
              { id: Math.random() * 100 + 100 },
              { id: Math.random() * 100 + 100 },
              { id: Math.random() * 100 + 100 },
              { id: Math.random() * 100 + 100 },
              { id: Math.random() * 100 + 100 },
              { id: Math.random() * 100 + 100 },
              { id: Math.random() * 100 + 100 },
            ],
          };
        },
        methods: {
          loadMore(e) {
            const st = e.target.scrollTop; // 滚动高度，上侧超出屏幕部分；
            const cheight = e.target.clientHeight; // 可视区域高度，肉眼可见部分，上下两侧不可见的内容不算。
            const theight = e.target.scrollHeight; // 可滚动区域总高度
            if (st + cheight >= theight) {
              console.log("到底了");
              setTimeout(() => {
                this.users = [...this.users, ...this.users];
              }, 1000);
            }
          },
        },
      };
      const vm = new Vue({
        el: "#app",
        data: {},
        methods: {},
        components: {
          goods,
        },
      });
      // 1. 谁绑定了@scoll事件，先找到它的父元素，设置height为固定高度(比如：100vh)，同时禁止滚动。
      // 2. 将绑定了@scoll事件的元素，设置允许滚动，同时设置高度为固定高度，不要和子元素的总高度一样。
    </script>
  </body>
</html>
